Программирование в Maple

Maple является не только прекрасным инструментом для проведения разнообразных вычислений, но и содержит полноценный внутренний язык программирования Рассмотрим основные конструкции: условия, циклы и процедуры.

Для написания красивого кода полезно уметь писать многострочные выражения в Maple . Это делается несложно: Shift+Enter .

Для записи строк используйте символ " ` ".

Условный оператор

Использование условий и циклов требует умения манипулировать логическими операторами: OR, AND, NOT . Составной оператор условного перехода имеет структуру:
if < cond > then < block > elif < cond > then < block >... else < block > fi ;
Здесь cond - выражение булевского типа, а block - любая группа команд Maple.

Конструкция elif < cond > then < block > может повторяться несколько раз или вовсе отсутствовать. Часть else < block > тоже не является обязательной.

> i:=4:
if i > 0 then
print(`Positive number.`);
elif i < 0 then
print(`Negative number.`);
else
print(`Zero number.`);
fi:

`Positive number.`

Часто вместо составного оператора ветвления бывает удобнее использовать функцию ветвления - `if `. Она имеет три аргумента, первый из которых является условием, а второй и третий - возвращаемыми значениями. Если первый аргумент принимает значение true, то возвращаемым значением функции является второй аргумент, а если false - третий. Приведем пример использования функции `if ` :

 > f:=`if`(x>1,sqrt(x),x^2);plot(f,x=-2..4);

f := `if`(1-x < 0,sqrt(x),x^2)

[Maple Plot]

Циклы

В Maple существует несколько разновидностей циклов. Стандартный арифметический цикл имеет следующую структуру:
for < var > from < exp1 > by < exp2 > to < exp3 > do < block > od;
Здесь группа команд block выполняется для каждого значения переменной цикла var, которая меняется от значения exp1 до значения exp3 с шагом exp2. Если конструкция from < exp1 > и/или by < exp2 > отсутствует, то соответствующие им выражения принимаются равными 1. Отметим, что переменная цикла может изменять свое значение не только при переходе к следующему шагу цикла, но и внутри тела цикла. Проиллюстрируем
это на примере:

 > for i from 1 by 1 to 10 do i:=i+3 od;

i := 4
i
:= 8
i
:= 12

 Итерационный цикл имеет структуру:
while < cond > do < block > od ;
Возможен и "гибрид" арифметического и итерационного циклов. Соответствующая конструкция имеет вид:
for < var > from < exp1 > by < exp2 > while < cond > do < block > od ;

> tot := 0;
for i from 11 by 2 while i < 20 do
tot := tot + i
end do;

tot := 0

tot := 11

tot := 24

tot := 39

tot := 56

tot := 75

Рассмотренные варианты организации циклов характерны (с теми или иными изменениями) для большинства языков программирования. Кроме них, в Maple имеется еще один специфический вид цикла. Как уже упоминалось, выражения в Maple имеют структуру дерева. Перебрать все ветви (операнды) первого уровня можно с помощью специального цикла, имеющего такой синтаксис:
for < var > in < exp > do < block > od ;
Проиллюстрируем работу этого цикла на примерах:

> f:=(x^3+3*x+1)*(x^2-x-3)*(x+2); for g in f do g od;

f := (x3 + 3 x + 1) (x2 - x - 3) (x + 2)
x
3 + 3 x + 1
x
2 - x - 3
x
+ 2

> for g in expand(f) do g od;

x6
x
5
-2 x4
-2 x3
-14 x2
-23 x
-6

> s:=0:for i in numtheory[divisors](60) do if numtheory[mobius](i)=1 then s:=s+i fi od;s;

32

 В последнем примере мы нашли сумму тех делителей числа 60, значение функции Мёбиуса от которых, равно 1.

В качестве иллюстрации использования циклов и условных операторов решим такую задачу: найти все пары простых чисел близнецов (так называют простые числа, отличающиеся друг от друга на 2) на отрезке натурального ряда чисел от 8000 до 9000.

 > printlevel:=0:
>
p:=nextprime(8000):
>
while p<8998 do
>
p1:=p+2:
>
if isprime(p1) then print(p,p1) fi;
>
p:=nextprime(p1)
>
od;

8009, 8011
8087, 8089
8219, 8221
8231, 8233
8291, 8293
8387, 8389
8429, 8431
8537, 8539
8597, 8599
8627, 8629
8819, 8821
8837, 8839
8861, 8863
8969, 8971


Обратите внимание на то, что перед началом вычислений мы присвоили значение 0 зарезервированной переменной printlevel. Дело в том, что на команды, вызываемые из вложенных структур, не распространяется правило регулирования вывода результатов выполнения команды на экран с помощью помещения точки с запятой или двоеточия после соответствующей команды. В этом случае отображаются результаты выполнения всех команд, глубина вложенности которых не превышает текущего значения зарезервированной переменной printlevel. Это делается для того, чтобы программа не печатала слишком много промежуточных результатов. Если же мы все же хотим вывести на экран результаты, получаемые на глубине вложенности, превышающей значение printlevel, достаточно использовать оператор print. По умолчанию значение printlevel равно 1. (Именно этим объясняется, что в примере, где мы вычисляли сумму части делителей числа 60, не были отображены на экране результаты присваиваний s := s+i)

Процедуры и функции

В Maple процедуры и функции не различаются в записи. Для их задания используется оператор proc .

> f := proc(x, y) local z;
if x<0 then
z:=x+y;
elif x>0 then
z:=x-y;
else
z:=y;
fi;
RETURN(z);
end proc;

f := proc (x, y) local z; if x < 0 then z := x+y el...

> f(2,1);
f(2,-1);
f(2,0);

1

3

2

Задания:

1.      Составить программу вычисления факториала числа n

2.      Создать массив A размерностью 10. Задать функцию F(x) согласно индивидуальному заданию (табл.1). Заполнить массив значениями функции f(i), где i=1..10. Провести селективную обработку полученного массива согласно индивидуальному заданию (табл.2). Вывести в текстовый файл: а) исходный массив; б) результат расчета.

Таблица 1 – Функции

F1(x), если x <= 3

F2 (x), если 3 < x <= 6

F3 (x), если 6 < x <= 10

1

tg(2x)

sin(3x)

cos(x-2)

2

4x+2

5/(X+0,4)

0,5/(2sin(4x))

3

x4/7

sin32x

4

ctg(X+0,4)

ln(2X+0,5)

5

x3-ln

ln3(x+4)

x4-x2-x

6

sin(x2)

e-x+

ln(x3+x2)

7

(3x-1)/x5

ln2

8

xcos(x)

1/(tg2x+1)

x2e-x

9

x1,2sin3x

x2cos x

sin x2+x0.25

10

x2x+1

sin x2

ln2 x+

11

sin2x3

sin(2x)

2sin(x-e-x)

12

2xe-x

cos(2x)

xx-cos x

1

sin(2x+1)

(x+1)2cos x3

2

cos(x)

x2+sin5x

3

x(sin(x)+2)

ln(4x+1)2

ln

4

x4+2x3-x

sin(2x)

Xx+1sin x

5

x5ctg2x3

ln(x+1)

e-2X-

6

sin(4x)

sin x2x-cosx

7

ctg(3x-1)2

2+xe-x

sin3x2

8

x sin(x-1)

5+18 tg(x)

2

9

(2x+1) / x5

ex+1+cosx

3ln

10

3x5-ctgx3

ln(sin4x+1)2

ln

11

1,3

3x+3

5x+1sin2x

12

e-3x

sin3x4

e-X+

Таблица 2 – Содержание задачи

Содержание задачи

1

Найти сумму наибольшего и наименьшего элементов массива

2

Вычислить среднее арифметическое элементов, удовлетворяющих условию 5<=A[і]<=15

3

Найти сумму квадратов максимального и минимального чисел

4

Найти количество элементов, не больших заданного числа K

5

Вычислить среднее арифметическое элементов, не меньших 10

6

Найти максимальный и минимальный элементы и поменять их местами

7

Найти количество элементов, принадлежащих интервалу 10<=A[i]<=50

8

Найти среднее геометрическое элементов, имеющих четный индекс

9

Найти разность суммы положительных и произведения отрицательных чисел

10

Найти номер наибольшего положительного элемента

11

Найти сумму и количество элементов, у которых индекс кратен 3

12

Найти частное от деления минимального элемента на максимальный

1

Вычислить сумму и количество элементов, имеющих нечетный индекс

2

Найти среднее арифметическое отрицательных элементов, стоящих на четных местах

3

Поменять местами первый и максимальный элемент

4

Найти сумму минимального положительного элемента и его номера

5

Поменять местами второй и наибольший положительный элементы

6

Вычислить среднее арифметическое максимального и минимального элементов

7

Найти сумму и количество положительных элементов, стоящих на четных местах

8

Вычислить частное от деления максимального элемента на его порядковый номер

9

Найти среднее геометрическое положительных элементов, стоящих на нечетных местах

10

Найти номер и значение наибольшего по модулю элемента

11

Вычислить сумму квадратов положительных элементов, имеющих нечетные индексы

12

Поменять местами максимальный положительный и минимальный отрицательный элементы

Пример вывода в файл

[ Вывести в текстовый файл: а) исходный массив; б) результат расчета.

[> filename:=`c:/lab5.txt`: fd:=fopen(filename,WRITE);

[ writeline(fd,`Массив A:`): st:=``:

[ for i from 1 by 1 to 10 do st:=cat(st,convert(A[i],string),` `): od:

[ writeline(fd,st):

[ st:=cat(`Сумма положительных элементов = `,convert(s,string)):

[ writeline(fd,st):

[ fclose(fd);

3.      Дана действительная квадратная матрица поряд­ка п. Найти сумму элементов, расположенных в заштрихованной части матрицы

 

 

4.      Даны целые числа a1,…,a30. Пусть M—наиболь­шее, а m—наименьшее из а1,…,a30. Получить в порядке возрастания все целые из интервала (m, М), которые не входят в последовательность a1,…,a30.